package com.distributeredis.redis_springboot.fileinputoutputstream;

import org.junit.Test;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;

public class TestInputOutputStream {
    // 字节流  一切皆字节 一切文件数据(文本、图片、视频等)在存储时，都
    // 是以二进制数字的形式保存，都一个一个的字节，
    // 那么传输时一样如此。所以，字节流可以传输任意文件数据。
    // 在操作流的时候，我们要时刻明确，无论使用什么样的流对象，
    // 底层传输的始终为二进制数据。
    @Test
    public void test1() throws Exception {
        // 使用文件名称创建流对象
        FileInputStream fis = new FileInputStream("H:\\LUA\\redis_springboot\\src\\main\\java\\com\\distributeredis\\redis_springboot\\fileinputoutputstream\\read.txt");
        // 定义变量，作为有效个数
        int len;
        // 定义字节数组，作为装字节数据的容器
        byte[] b = new byte[2];
        // 循环读取
        while ((len = fis.read(b)) != -1) {
            // 每次读取后，把数组的有效字节部分，变成字符串打印
            System.out.println(new String(b,0,len)); // len每次读取的有效字节个数
        }
        // 关闭资源
        fis.close();
    }
    // 综合练习，图片复制
    @Test
    public void test2() throws Exception {
        // 创建流对象
        FileInputStream fis = new FileInputStream("H:\\LUA\\redis_springboot\\src\\main\\java\\com\\distributeredis\\redis_springboot\\fileinputoutputstream\\a.jpg");
        // 指定目的地
        FileOutputStream fos = new FileOutputStream("H:\\LUA\\redis_springboot\\src\\main\\java\\com\\distributeredis\\redis_springboot\\fileinputoutputstream\\b.jpg");
        // 读写数据，定义数据源
        byte[] b = new byte[1024];
        // 定义长度
        int len;
        // 循环读取
        while ((len = fis.read(b)) != -1) {
            // 写出数据
            fos.write(b,0,len);
        }
        // 关闭资源
        fos.close();
        fis.close();
    }
    // 字符流，读取文本文件
    @Test
    public void test3() throws Exception{
        // 使用文件名称创建流对象
        FileReader fr = new FileReader("H:\\LUA\\redis_springboot\\src\\main\\java\\com\\distributeredis\\redis_springboot\\fileinputoutputstream\\read.txt");
        FileWriter fw = new FileWriter("H:\\LUA\\redis_springboot\\src\\main\\java\\com\\distributeredis\\redis_springboot\\fileinputoutputstream\\read1.txt");
        // 定义变量，保存有效字符个数
        int len;
        // 定义字符数组，作为装数据的容器
        char[] b = new char[2];
        // 循环读取
        while ((len=fr.read(b))!= -1) {
            System.out.println(new String(b,0,len));
            fw.write(b,0,len);
        }
        //关闭资源
        fw.close();
        fr.close();
    }
    @Test
    public void test4() throws Exception {
        StringBuilder sb = new StringBuilder();
        // 使用文件名称创建流对象
        FileInputStream fis = new FileInputStream("H:\\LUA\\redis_springboot\\src\\main\\java\\com\\distributeredis\\redis_springboot\\fileinputoutputstream\\a.txt");
        // 定义变量，作为有效个数
        int len;
        // 定义字节数组，作为装字节数据的容器
        byte[] b = new byte[2];
        // 循环读取
        while ((len = fis.read(b)) != -1) {
            // 每次读取后，把数组的有效字节部分，变成字符串打印
            sb.append(new String(b, 0, len));
        }
        System.out.println(sb);
        // 关闭资源
        fis.close();
    }

    /**
     * 字节缓冲流
     * @throws Exception
     */
    @Test
    public void test5() throws Exception {
        // 创建流对象
        BufferedInputStream fis = new BufferedInputStream(new FileInputStream("H:\\LUA\\redis_springboot\\src\\main\\java\\com\\distributeredis\\redis_springboot\\fileinputoutputstream\\a.jpg"));
        // 指定目的地
        BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("H:\\LUA\\redis_springboot\\src\\main\\java\\com\\distributeredis\\redis_springboot\\fileinputoutputstream\\c.jpg"));
        // 读写数据，定义数据源
        byte[] b = new byte[1024];
        // 定义长度
        int len;
        // 循环读取
        while ((len = fis.read(b)) != -1) {
            // 写出数据
            fos.write(b,0,len);
        }
        // 关闭资源
        fos.close();
        fis.close();
    }
    /**
     * 字符缓冲流
     */
    @Test
    public void test6() throws Exception{
        // 创建map集合,保存文本数据,键为序号,值为文字
        HashMap<String, String> lineMap = new HashMap<>();

        // 创建流对象
        BufferedReader br = new BufferedReader(new FileReader("H:\\LUA\\redis_springboot\\src\\main\\java\\com\\distributeredis\\redis_springboot\\fileinputoutputstream\\out.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("H:\\LUA\\redis_springboot\\src\\main\\java\\com\\distributeredis\\redis_springboot\\fileinputoutputstream\\in.txt"));

        // 读取数据
        String line  = null;
        while ((line = br.readLine())!=null) {
            // 解析文本
            String[] split = line.split("\\.");
            // 保存到集合
            lineMap.put(split[0],split[1]);
        }
        // 释放资源
        br.close();

        // 遍历map集合
        for (int i = 1; i <= lineMap.size(); i++) {
            String key = String.valueOf(i);
            // 获取map中文本
            String value = lineMap.get(key);
            // 写出拼接文本
            bw.write(key+"."+value);
            // 写出换行
            bw.newLine();
        }
        // 释放资源
        bw.close();
    }

}
